package com.company.zhishidian.jihe;

import com.company.zonghelizi.wangzhe.Hero;

import java.util.*;

class JiHeArrayList{
    public static void main(String[] args) {
        List<String> list = new ArrayList();
        list.add("bbb");
        list.add("aaa");
        list.add("ccc");
        System.out.println(list);
        List<String> list2 = new ArrayList<>();
        list2.add("qqq");
        // 一次性添加另一个集合元素到尾部
        list2.addAll(list);
        // 判断是否包含，用equals
        System.out.println(list.contains("aaa"));
        // 找到某元素的位置信息
        list.indexOf("ccc");
        // 删除指定位置的
        list.remove(2);
        // 删除元素
        list.remove("aaa");
        // 替换指定位置
        list2.set(2,"TTT");
        // 转成数组
        String[] arr2 = list.toArray(new String[]{});
        // 数组转成list   功能不全
        List list3 = Arrays.asList("aaa","bbb","ccc","ddd");
        list3.add("123");  // UnsupportedOperationException  不支持运行时异常
        // 支持快速访问，插入元素较慢
    }
}

class JiHeLinkedList{
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        // 在头部追加
//        list.addFirst("www");

        // 队列先进先出的效果
        // 加到尾部
        list.offer("www");
        list.offer("ccc");
        System.out.println(list);
        // 取出头部
        list.poll();
        System.out.println(list);

        // 栈的实现效果
        // 加到头部
//        list.push("www");
//        // 取出头部
//        list.pop();
    }
}

class JiHeHashSet{
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("aaa");
        set.add("bbb");
        set.add("ccc");
        set.add("ccc");
        System.out.println(set);
        // 遍历
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
    }
}

class JiHeTreeSet{
    public static void main(String[] args) {
        Set<String> set = new TreeSet<>();
        set.add("qqq");
        set.add("bbb");
        set.add("aaa");
        set.add("ccc");
        System.out.println(set);
    }
}

// 集合工具类
class TestCollections{
    public static void main(String[] args) {
        List<Man> list = new ArrayList<>();
        Man m1 = new Man("aaa",50);
        Man m2 = new Man("bbb",40);
        Man m3 = new Man("ccc",30);
        Man m4 = new Man("ddd",35);
        Man m5 = new Man("eee",45);
        list.add(m1);
        list.add(m2);
        list.add(m3);
        list.add(m4);
        list.add(m5);
        // 比较是否一个人
        boolean b = method(list);
        System.out.println(b);
        // 最大值
        Man man = Collections.max(list);
        System.out.println(man);
        // 排序 ,应用合并排序法，n*logn
        Collections.sort(list);
        System.out.println(list);
        // 倒序
        Collections.reverse(list);
        System.out.println(list);
        // 集合降序
        Collections.sort(list,(x,y)->{return y.getAge() - x.getAge();});
    }
    public static boolean method(List<Man> list){
        return list.contains(new Man("aaa",50));
    }
}
// 集合工具类的排序方法需要制定排序方式，即实现Comparable接口的compareTo（）
class Man implements Comparable<Man>{
    private String name;
    private int age;
    public Man(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "Man{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Man man = (Man) o;
        return age == man.age &&
                Objects.equals(name, man.name);
    }
    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
    @Override
    public int compareTo(Man o) {
        return this.age - o.age;
    }
}

class JiHeMap{
    public static void main(String[] args) {
        // 第一组
        Map<String,Integer> map = new HashMap<>();
        map.put("111",new Integer(111));
        map.put("222",new Integer(111));
        map.put("333",new Integer(111));
        Integer value = map.get("111");
        System.out.println(value);

        // map迭代
        // 返回所有的key ,放到set里
        Set<String> keySet = map.keySet();
        // 迭代key,取出所有的value
        for (String key:keySet) {
            System.out.println(key+"="+map.get(key));
        }
        // 返回所有的value,不关心key
        Collection<Integer> c = map.values();
        for (Integer in:c) {
            System.out.println(in);
        }
        // 单个键值对,                             会得到一组键值对
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for(Map.Entry<String,Integer> entry:entrySet){
            System.out.println(entry.getKey()+'='+entry.getValue());
        }

        // 第二组带对象的
        Map<String, Hero> map1 = new HashMap<>();

        map1.put("aaa",new Hero("aaa",100));
        map1.put("bbb",new Hero("aaa",100));
        map1.put("ccc",new Hero("aaa",100));
        map1.put("1",new Hero("aaa",100));

        //允许一个null作为可以
//        map1.put(null,new Hero("aaa",100));
        // 判断是否包含
//        map.containsValue(new Hero("ccc",130));
//        map.containsKey("aaa");
//
//        map.remove("ccc");
    }
}